package fr.charlott.view;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.charlott.business.dto.ClienteDTO;
import fr.charlott.business.dto.HotesseDTO;
import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.service.ClienteService;
import fr.charlott.tools.exceptions.FunctionalException;
import fr.charlott.tools.exceptions.TechnicalException;

@Component("nouvelleClienteControler")
@Scope("view")
public class NouvelleClienteControler extends CharlottControler {

    private static final long serialVersionUID = -6404906491610002771L;

    public static final String EDITED_CLIENTE = "editedCliente";

    /**
     * Service
     */
    private ClienteService clienteService;

    private ClienteDTO cliente;

    private HotesseDTO selectedHotesse;

    private ProduitDTO[] selectedProduits;

    public NouvelleClienteControler() {
        super();
    }

    @Autowired(required = true)
    public NouvelleClienteControler(ClienteService clienteService) {
        super();
        this.clienteService = clienteService;

        // Recupere la personne selectionnee dans la session
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        cliente = (ClienteDTO) externalContext.getSessionMap().get(EDITED_CLIENTE);

        if (cliente == null) {
            cliente = new ClienteDTO();
        }
    }

    // actionListener
    public void selectionnerHotesseListener(ActionEvent actionEvent) {
        cliente.setHotesse(selectedHotesse);
    }

    public void selectionnerProduitsListener(ActionEvent actionEvent) {
        List<ProduitDTO> list = new ArrayList<ProduitDTO>();
        for (ProduitDTO p : selectedProduits) {
            list.add(p);
        }
        cliente.setProduits(list);
    }

    // navigation
    public String ajouterCliente() throws TechnicalException, FunctionalException {
        try {
            clienteService.ajouterCliente(cliente);
            cleanSession(EDITED_CLIENTE);
            return "listeClientes";
        } catch (TechnicalException e) {
            FacesMessage msg = new FacesMessage("Error", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return null;
        }

    }

    public String annuler() {
        cleanSession(EDITED_CLIENTE);
        return "listeClientes";
    }

    // getters / setters

    public ClienteDTO getCliente() {
        return cliente;
    }

    public HotesseDTO getSelectedHotesse() {
        if (cliente.getHotesse() != null)
            return cliente.getHotesse();
        return selectedHotesse;
    }

    public void setSelectedHotesse(HotesseDTO selectedHotesse) {
        this.selectedHotesse = selectedHotesse;
    }

    public ProduitDTO[] getSelectedProduits() {
        if (cliente.getProduits() != null) {
            if (cliente.getProduits().size() > 0) {
                ProduitDTO[] t_produits = new ProduitDTO[cliente.getProduits().size()];
                for (int i = 0; i < cliente.getProduits().size(); i++) {
                    t_produits[i] = cliente.getProduits().get(i);
                }
                return t_produits;
            }
        }
        return selectedProduits;
    }

    public void setSelectedProduits(ProduitDTO[] selectedProduits) {
        this.selectedProduits = selectedProduits;
    }

}